package com.xxx.api;

import com.xxx.config.api.AbstractResource;
import com.xxx.entity.UserEntity;
import com.xxx.service.UserService;
import com.xxx.util.jwt.PassToken;
import jakarta.validation.Valid;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import org.springframework.beans.factory.annotation.Autowired;

// 资源可访问路径
@Path("/user")
// 回参以json格式返回
@Produces(MediaType.APPLICATION_JSON)
public class UserResource extends AbstractResource {

    @Autowired
    private UserService userService;

    @GET
    @Path("/info")
    // 获取个人信息，登录者，id通过header中的token获取
    public Response mine() {
        return this.ok(userService.mine());
    }

    @PUT
    @Path("/edit")
    // 这里增加了 @Valid 校验，看看实体对象中哪些属性不要的删掉
    public Response edit(@Valid UserEntity entity) {
        userService.edit(entity);
        return this.successEdit();
    }

    @POST
    @Path("/login")
    // 自定义@PassToken 注解，不需要token也能访问
    @PassToken(canPass = true)
    // form传参，且请求类型必须为 application/x-www-form-urlencoded
    public Response login(@FormParam("username") String username,
                          @FormParam("password") String password) {
        return this.ok(userService.login(username, password));
    }

    @PUT
    @Path("/logout")
    // 登出，清除token
    public Response logout() {
        userService.logout();
        return this.success();
    }

    @PUT
    @Path("/register")
    // 使用 BeanParam 注解，可以自动将请求参数绑定到实体类上，但是实体必须使用 @FormParam 注解修饰属性，否则会报错
    // 而且，请求类型必须是 application/x-www-form-urlencoded
    // 并且必须加上无参构造和所有有参构造......不太建议使用......
    // 不加 @BeanParam 注解，请求类型必须是 application/json，简单，推荐
//    public Response register(@Valid @BeanParam UserEntity entity) {
    public Response register(@Valid UserEntity entity) {
        userService.register(entity);
        return this.success();
    }

}
